package jp.sinmetal.trainer.util;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import org.seasar.framework.beans.util.BeanMap;

/**
 * ページングクラス。
 *
 * ページング機能はここに書く
 * @author sin
 *
 */
public class PagingUtil {

	protected final int MIN_PAGE = 2;
	protected final int START_PAGE = 1;

	/**
	 * ページング用Map作成
	 * ２ページに満たない場合は、ページングを作成しない
	 * @author sin
	 *
	 * @param totalRec
	 * @param limitNum
	 * @param paramMap {クエリストリングのKey, クエリストリングのValue} のマップ
	 * @return {ページ番号, クエリストリング}} のマップ
	 */
	public Map<Integer, String> makePagingLink(final long totalRec, final long limitNum, final BeanMap paramMap ) {
		int totalPage = getTotalPage(totalRec, limitNum);
        if (totalPage < MIN_PAGE) {
        	return new HashMap<Integer, String>();
        }

        //{ページ番号, クエリストリング} のマップ
        Map<Integer, String> map = new LinkedHashMap<Integer, String>();
        if (paramMap != null) {
        	for (int i = START_PAGE; i <= totalPage; i++) {
        		map.put(i, createParameterStr(i, limitNum, paramMap));
        	}
        } else {
        	for (int i = START_PAGE; i <= totalPage; i++) {
        		map.put(i, String.format("&%s=%d", "offsetNum", (i - 1) * limitNum));
        	}
        }

        return map;
	}

    /**
     * 総ページ数を返す
     * @author sin
     *
     * @param totalRec
     * @param perPage
     * @return 1ページに満たない場合は、0を返す
     */
    protected int getTotalPage(final long totalRec, final long perPage) {
		long totalPage = totalRec / perPage;
		long modRec = totalRec % perPage;

		//2010.6.4 yocy 修正 以前の条件式がまどろっこしかったので修正
		if (totalPage <= 0) {
			totalPage = 0;
		}
		if (modRec > 0) {
			totalPage++;
		}

		//intに入らない値は切り捨てる
		return (int)totalPage;
	}

    /**
     * パラメータ文字列作成
     * @author sin
     *
     * @param pageNum
     * @param paramMap
     * @return
     */
    protected String createParameterStr(final int pageNum, final long limitNum, final BeanMap paramMap) {
    	StringBuilder sb = new StringBuilder();
    	for (String key : paramMap.keySet()) {
    		sb.append(String.format("&%s=%s", key, paramMap.get(key)));
    	}
    	sb.append(String.format("&%s=%d", "offsetNum",(pageNum - 1) * limitNum));
    	return sb.toString();
    }
}
